/**
*  \file secacc_crypto.h
*
*  \brief   Crypto algorithms for security access.
*
*  \author   Michael J. Hohmann <michael.hohmann@linde-mh.de>
*
*
*/

#ifndef SECACC_CRYPTO_H_INCLUDED
#define SECACC_CRYPTO_H_INCLUDED

#ifndef SECACC_CRYPTO_LINKAGE
#define SECACC_CRYPTO_LINKAGE extern
#endif

/*================================================[ public includes  ]================================================*/
#include "../cfg/prj.h"

/*================================================[ public defines   ]================================================*/

/*================================================[ public datatypes ]================================================*/

/*================================================[ public variables ]================================================*/

/*================================================[ public functions ]================================================*/

/** Key Calculation for Security Access 1/2.
*
*  \param seed Input value.
*
*  \return Calculated Key.
*/
STATIC_INLINE U32 secacc_crypto_12( U32 seed )
{
   /* calculate key */
   const U32 a = U32_CONST( 0x974c58ab );
   const U32 b = U32_CONST( 0xfedcba98 );
   const U32 c = U32_CONST( 0x98765432 );
   U32 x = seed + a;

   if( (0xffffffff - a) < seed)
   {
      x ^= b;
   }
   else
   {
      x ^= c;
   }

   x = (x >> 11) | ((x & 0x7ff) << 21);

   return x;
}

/** Key Calculation for Security Access 3/4.
*
*  \param seed Input value.
*
*  \return Calculated Key.
*/
STATIC_INLINE U32 secacc_crypto_34( U32 seed )
{
   return seed + 0x1AF7;
}

/** Key Calculation for Security Access 5/6.
*
*  \param seed Input value.
*
*  \return Calculated Key.
*/
STATIC_INLINE U32 secacc_crypto_56( U32 seed )
{
   U32 rv;
   U8 data[8];

   data[3]= (U8)seed;
   seed>>=8;
   data[2]= (U8)seed;
   seed>>=8;
   data[1]= (U8)seed;
   seed>>=8;
   data[0]= (U8)seed;

   data[0]+=0x97;
   data[1]+=0x28;
   data[2]+=0xAA;
   data[3]+=0x55;

   rv = data[3];
   rv<<=8;
   rv|= data[2];
   rv<<=8;
   rv|= data[1];
   rv<<=8;
   rv|= data[0];

   return rv;
}



/*====================================================================================================================*/


#endif

/***********************************************************************************************************************
*                             Copyright 2010 Linde Material Handling. All rights reserved.                             *
***********************************************************************************************************************/
